/**
 * 给定一个数组， 将数组中的元素向右移动 k 个位置， 其中 k 是非负数。

 示例 1:

     输入: [1, 2, 3, 4, 5, 6, 7] 和 k = 3
 输出: [5, 6, 7, 1, 2, 3, 4]
 解释:
     向右旋转 1 步: [7, 1, 2, 3, 4, 5, 6]
 向右旋转 2 步: [6, 7, 1, 2, 3, 4, 5]
 向右旋转 3 步: [5, 6, 7, 1, 2, 3, 4]
 示例 2:

     输入: [-1, -100, 3, 99] 和 k = 2
 输出: [3, 99, -1, -100]
 解释:
     向右旋转 1 步: [99, -1, -100, 3]
 向右旋转 2 步: [3, 99, -1, -100]
 说明:

     尽可能想出更多的解决方案， 至少有三种不同的方法可以解决这个问题。
 要求使用空间复杂度为 O(1) 的原地算法。
 */


/**
 * leecode 耗时最少解法
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function (nums, k) {
    nums.unshift(...nums.splice(nums.length - k));
}

let x = [1, 2, 3, 4, 5, 6, 7];
const re = rotate(x, 3);

console.log(x);


/**
 * other
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function (nums, k) {
    k %= nums.length;
    reverse(nums, 0, nums.length - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, nums.length - 1);
};

function reverse(nums, start, end) {
    while (start < end) {
        let temp = nums[start];
        nums[start] = nums[end];
        nums[end] = temp;
        start++;
        end--;
    }
}
